#include "record.h"

Record::Record(const QSize imageSize, const QString videoName) : size(imageSize), name(videoName), cvimage(NULL), writer(NULL), inRefresh(false){}

Record::~Record(){
    if(cvimage){
        cvReleaseImage(&cvimage);
        cvimage=NULL;
    }
    if(writer){
        cvReleaseVideoWriter(&writer);
        writer=NULL;
    }
}

void Record::setNameTest(QString const nameTest)
// Definit le nom du dosssier dans lequel sera enregistre les images
{
    nameDir = nameTest;
}

void Record::run()
// Lancement de l'enregistrement du flux de la camera dans un fichier video
{
    if (nameDir.isEmpty()){
        nameDir = QDateTime::currentDateTime().toString();
    }
    QString nameVidDir;
    QDir lDir;
    lDir.mkdir(nameDir);
    nameVidDir = nameDir+"/video/";
    lDir.mkdir(nameVidDir);
    nameVidDir = nameVidDir+name;

    writer = cvCreateVideoWriter(nameVidDir.toStdString().c_str(),CV_FOURCC('D','I','V','X'),25,cvSize(size.width(),size.height()),1);

    timer = new QTimer();
    timer->moveToThread(QThread::currentThread());
    connect(timer, SIGNAL(timeout()), this, SLOT(refresh()), Qt::DirectConnection);
    connect(this, SIGNAL(stopSignal()), timer, SLOT(stop()), Qt::DirectConnection);
    timer->start(40);
    exec();
}

void Record::setSize(const QSize imageSize)
// Definit la taille de la video, n'a d'effet qu'avant un run()
{
    size = imageSize;
}

void Record::terminate()
// Surcharge de terminate pour arreter le thread proprement
{
    emit stopSignal();
}

void Record::refresh()
// Les images sont enregistrées une par une
{
    if(inRefresh){
        return;
    }
    inRefresh=true;
    if(cvimage) cvReleaseImage(&cvimage);
    cvimage = NULL;

    locker.lock();
    if(cvimageinter){
        cvimage = cvCloneImage(cvimageinter);
    }
    locker.unlock();

    if(cvimage){
        cvWriteFrame(writer, cvimage);
    }
    inRefresh=false;
}
